#include <iostream>
#include <functional>       //函数包装器头文件

//自由函数
void save_with_free_fun(const std::string& file_name)
{
    std::cout << "自由函数：" << file_name << std::endl;
}

//成员函数
class FileSave
{
private:
    /* data */
public:
    FileSave(/* args */) = default;
    ~FileSave() = default;

    void save_with_member_fun(const std::string& file_name)
    {
        std::cout << "成员函数：" << file_name << std::endl;
    }
};

int main()
{
    FileSave file_save;

    //Lambda函数
    auto save_with_lambda_fun = [](const std::string& file_name) -> void{std::cout << "Lambda函数：" << file_name << std::endl;};

    //调用各种函数
    save_with_free_fun("file.txt");
    file_save.save_with_member_fun("FileSave.txt");
    save_with_lambda_fun("Lambda.txt");
    //使用函数封装器
    std::function<void(const std::string& file_name)> Save1 = save_with_free_fun;
    std::function<void(const std::string& file_name)> Save2 = save_with_lambda_fun;
    std::function<void(const std::string& file_name)> Save3 = std::bind(&FileSave::save_with_member_fun /* 函数的指针 */, &file_save /* 对象的指针 */, std::placeholders::_1 /* 包装函数参数的占位符 */);

    Save1("functional free.txt");
    Save2("functional lambda.txt");
    Save3("functional FileSave.txt");

    return 0;
}

